【SWF】JAWS-UG浅草「初」勉強会 SimpleWorkflowハンズオンに参加してきた
はじめに
こんにちは植木和樹です。7月15日にJAWS−UG浅草主催でAmazon Simple Workflow Serviceのハンズオンが開かれましたので参加してきました。本日は参加レポートとなります。
私も各地のJAWS-UG勉強会に参加しておりますが、Simple Workflow(SWF)は初めてだと思います(JAWS DAYS 2014で@okeee0315さんがACEに聞けでやったくらい?)。日本にどれくらいSWFユーザーがいるんでしょうね?と得上さんに質問したところ、名刺管理の「Eight」やクラウド会計ソフトの「freee」で使われているそうです。
ちなみにJAWS-UG浅草での勉強会は初だそうです。普段の活動場所はホッピー通りですものね(笑)。
会場は上野と浅草の中間あたりにあるChatWork様東京オフィス。レンガ調でオシャレな内装でした。
ハンズオンでやる(予定だった)こと
- ただのHelloWorld ... (環境構築とコンパイル・実行まで)
- みんなのHelloを待ってWorld ... (AndPromise)
- 誰か一人でもHelloって言ってくれたらWorld ... (OrPromise)
- からの他の人はもうHello言わなくていいよ ... (時間切れ ><)
- 時間制限付きHelloWorld
- 失敗してもHelloWorld
- 失敗からのリトライでのHelloWorld
- 定期的にHelloWorld
予定通り17:30に集合して全員が黙々と手を動かして進めていました。途中10分程の小休憩を入れた以外は、ほぼぶっ通しで取り組んでいたんで約4時間、まさに勉強してるって感じで集中してました。しかし残念ながら時間切れ。SWF未経験者が上の予定を全部こなすには1泊2日の合宿が必要だと思います。
SWF開発でのポイント
環境構築が難しい
- マネージメントコンソールからのマウスクリックだけで使えるサービスではない。
- Eclipseでの開発環境準備。
- 各種ライブラリのインストール。
- Java(>=5)の知識が必要。
コンパイル通して実行までが一番の壁
- コンパイルがそもそも通らない
- アノテーションがポイント
- Java SE 5から入った機能
- アノテーションはいわゆるプリコンパイラ
安定した回線が必要
- ワーカー(ActivityHostやDeciderHost)が頻繁にSWF APIと通信するため。
- 回線が不安定だとちょくちょく予想外のエラーがでる。
ハンズオンでの学びポイント
Eclipse + Toolkitでの環境構築
SWF開発にはAWS Toolkit for Eclipseをインストールするのがオススメです。Eclipseの[Help] - [Install new software]で[work with]のテキストボックスに http://aws.amazon.com/jp/eclipse/ を指定するとインストールができます。
- ToolkitにはEC2やDynamoDB用のライブラリも含まれていますがSWF(AWS Simple Workflow Tools)のみチェックする。
- Eclipse (Luna)だとフルセットだと依存関係の問題でインストールに失敗する。
mavenを使ったサンプルプロジェクトセットアップ
- 面倒なのでmavenで雛形作りました(得上さん)
- ワンコマンドでAmazon SWFのアプリケーションを作り始める | Developers.IO
% mvn archetype:generate -DarchetypeCatalog=http://mvn.tottokug.com/catalogs/swf-application.xml
サンプルプロジェクトを作成したら、Eclipseの [Import] - [Maven] - [Existing maven project] でプロジェクトをインポートします。
その後、[Project] -
[Java Compiler] - [Annotation Processing] - [Enable Project specific settings]をチェックし、[Generated source directory]に "src/apt/java" を指定する。これでアノテーションで自動生成されたソースがこのディレクトリに出力されるようになります。
DeciderHostとActivityHostの起動
% export JAVA_HOME=`/usr/libexec/java_home` % mvn exec:java -Dexec.mainClass=jp.classmethod.host.ActivityHost % mvn exec:java -Dexec.mainClass=jp.classmethod.host.DeciderHost % mvn exec:java -Dexec.mainClass=jp.classmethod.ExecutionStarterActivityやWorkflowの作成・変更
- ワークフローは1インターフェースに1ワークフローのみ定義が可能。(@Execute指定は1メソッドのみ)
- アクティビティは1インターフェースに複数アクティビティが定義可能。(@Activityは複数メソッドへ指定可能)
- ワークフローからはアクティビティのクライアントを呼び出す。
- クライアントクラスはアノテーションが自動的に生成してくれる。
- "External"ワークフローってなに?
- 外部アプリケーションに公開されたワークフローということ。Starterからの発火ポイント。
- ワークフローの入れ子をする時には、Externalではないワークフローも使ったりする
- WorkflowFactoryから得たWorkflowClientは一度しか実行できない。(1度きりのため重複実行を防げる)
AndPromise/OrPromiseによるアクティビティの同期
- サンプルをいじって学ぶ Amazon SimpleWorkflow Service | Developers.IO
- 各アクティビティの実行は非同期なので、ソースに書かれた順の実行は保証されない。
<
pre>
NamedHelloWorldActivitiesClient client = new NamedHelloWorldActivitiesClientImpl(); client.hello("植木"); client.hello("横田"); client.hello("得上"); client.world();
普通にやると world が先に実行されてしまう。そのため非同期プログラミングにおけるデザインパターンPromiseパターンを利用して実行の同期を行う。
- AndPromise(com.amazonaws.services.simpleworkflow.flow.core.AndPromise)
- すべてのActivityの実行を待ってから実行するための仕組み
- OrPromise(com.amazonaws.services.simpleworkflow.flow.core.OrPromise)
- いずれかのActivityの実行が終わったら実行するための仕組み
例外処理
- TryCatch抽象クラスを使用する
- doTryメソッド
- doCatchメソッド(この中でリトライ、終了処理を行う)
- アクティビティのメソッドに @ExponentialRetry をつける。以下のプロパティが指定可能。
- リトライインターバル(initialRetryIntervalSeconds)
- 最大試行数(maximumAttempts)
詳しくは「サンプルをいじって学ぶ Amazon SimpleWorkflow Service | Developers.IO」参照。
まとめ
ハンズオンを終えて参加者全員が一言「ようやく自習できる準備が整った」。
SWF自体は都元さんや、謎の出張ブロガー「あけり」さんがいくつかブログを書いています。
- Amazon Simple Workflow Service (SWF) 入門 | Developers.IO
- サンプルをいじって学ぶ Amazon SimpleWorkflow Service | Developers.IO
- ワンコマンドでAmazon SWFのアプリケーションを作り始める | Developers.IO
私自身も読んでなんとなくは知っているつもりだったのですが、やはり実際に使っている方に教えてもらいながら手を動かすと全然理解できていなかったことに気付きます。AWSからは各種サービスが提供されていますが、SWFは独習はかなり難しいサービスだと思います。
次回は涼しい場所でSWF合宿しようか〜という話もでています。いいですね、是非是非参加したいです。新潟の赤倉温泉なんてどうでしょうね?
SWFは取っ付きづらいですが、あらゆるバッチ処理に応用が効きそうで夢のあるサービスだと思います。興味のある方はハンズオンにご参加ください。そして日本にSWFユーザーが増えたらいいなと思います。